<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // 试编写 “智能重复” smartRepeat 函数，实现：
      // • 将 3[abc] 变为 abcabcabc
      // • 将 3[2[a]2[b]] 变为 aabbaabbaabb
      // • 将 2[1[a]3[b]2[3[c]4[d]]] 变为 abbbcccddddcccddddabbbcccddddcccdddd
      function smartRepeat(templetStr) {
        let index = 0;
        let strList = [];
        let numList = [];
        while (index <= templetStr.length - 1) {
          // 本次遍历的剩余部分
          let restStr = templetStr.substring(index);
          console.log(restStr);
          if (/^\d+\[/.test(restStr)) {
            // 剩余部分匹配到 `数字[` 开头
            let times = restStr.match(/^(\d+)\[/)[1];
            // console.log("匹配到 `数字[` 开头：", times);
            // 指针后移，跳过 ‘数字’ 和 `[`
            index = index + times.toString().length + 1;
            strList.push(""); // 字符串栈塞入一个空字符串
            numList.push(times); // 数字栈塞入一个数字，代表循环次数
          } else if (/^\w+\]/.test(restStr)) {
            // 匹配到 字母 + `]` 开头
            let letter = restStr.match(/^(\w+)\]/)[1];
            // console.log("匹配到 ’字母]‘ 开头，输出字母部分：", letter);
            // 把字母部分赋给字符串栈的最后一个元素
            strList[strList.length - 1] = letter;
            // 指针后移
            index += letter.length;
          } else if (restStr[0] === "]") {
            // 匹配到 `]` 开头
            let times = numList.pop(); // 弹出数字栈的最后一个元素
            let str = strList.pop(); // 弹出字符串栈的最后一个元素
            // console.log("匹配到 `]` 开头", times, str);
            str = str.repeat(times); // 重复字符串
            // 如果是匹配的最后一个 ‘]’, 此时 numList 和 strList 都为空
            // 代表匹配结束，需要输出结果
            if (index === templetStr.length - 1) {
              // 如果是最后一个字符，直接返回结果
              return str;
            } else {
              // 把重复后的字符串赋值给字符串栈的最后一个元素
              strList[strList.length - 1] += str;
            }
            index++; // 向后移动 1 位
          } else {
            // 代码在开发过程中可能出现逻辑错误，防止死循环
            index++;
            // console.log("匹配到 字母", restStr[0]);
          }
          console.log(index, strList, numList);
        }
      }
      let originalStr = "12[3[a]4[1[b]2[c]]]";
      let result = smartRepeat(originalStr);
      console.log(result);
    </script>
  </body>
</html>
